打包

打包

重新学,估计得直接从官方文档开始学了,TODO

Setuptools

Setuptools 是主流的 Python 打包工具,相当于 Java 的 Maven。

官方文档:Quickstart - setuptools 68.0.0.post20230720 documentation

三种配置文件:TODO

setup.py 作为作为一种配置机制,Setuptools 为 setup.py 文件提供了一流的支持,然而,强烈不建议将 setup.py 文件作为脚本运行 (例如 python setup.py sdist),并且大多数命令行接口已经 (或将被) 弃用 (例如 python setup.py install, python setup.py bdist wininst)。

我们建议用户通过 pyproject.toml 或者 setup.cfg 以更具声明性的方式公开尽可能多的配置。并保持 setup.py 的最小化,只包含动态部分 (如果可以的话,甚至可以完全不使用 setup.py)。

通过这篇文章了解为什么不建议使用 setup.py 文件:Why you shouldn’t invoke setup.py directly

Setuptools 不推荐使用 setup.py,推荐使用 pyproject.toml+python -m build。但是很多博客内容仍然采用 setup.py 文件作为打包的配置文件,我们心里明白 setup.py 文件一种过时的打包配置方式即可,本片博客会全程学习如何通过 pyproject.toml 来配置打包的过程。

关于 toml 这种配置文件格式,请看《TOML 配置文件.md

build 包

安装

pycharm 对 Setuptools 的支持


安装

安装 setuptools,一般默认就已经安装,我们只需要自己编写 setup.py 即可

pip install setuptools

打包

安装到本地

python setup.py install

该命令会将当前的 Python 应用安装到当前 Python 环境的”site-packages”目录下, 这样其他程序就可以像导入标准库一样导入该应用的代码了

有点像 Maven 的 mvn install 命令的效果,将打出的包安装到 Maven 的本地仓库,这样,本地的其他项目就可以通过 Maven 依赖导入这个包

上传到 Pypi

像 Maven 的 mvn deploy 命令

Pycharm 支持

Create and run setup.py | PyCharm Documentation

Pycharm 可以自动创建 setup.py 文件,还提供了工具来执行,但是没啥卵用

有没有什么办法,可以一键执行 setup.py 文件打包,可以把 pycharm 的操作设置快捷键,TODO

总结

其实这个流程真的很像 Maven 的生命周期,参考《Maven 听课笔记.docx》的 Maven 概述 小节


下载 build 模块:

然后下载 wheel 模块

This library is the reference implementation of the Python wheel packaging standard, as defined in PEP 427.

It has two different roles:

A setuptools extension for building wheels that provides the bdist_wheel setuptools command
A command line tool for working with wheel files
It should be noted that wheel is not intended to be used as a library, and as such there is no stable, public API.

参考教程:build 0.10.0,跟着这个教程来,基本上就没问题了,

我感觉比 Maven 简单多了,

默认使用模拟的隔离环境来打包,但是使用隔离环境的时候,无法下载依赖,所以我们一般不使用隔离环境,不使用隔离环境的时候,你本地就得把打包需要的依赖都下好,比如 wheel,还有项目本身需要的依赖

 python -m  build -n

打包的结果有两个,一般在 /dist 目录下,一个是源码包(以 .tar.gz 结尾),一个是二进制包(以 .whl 结尾)



Quickstart - setuptools 68.2.2.post20230929 documentation

通过 project.scripts 配置,我们可以在安装 Python 包之后,以可执行脚本的方式暴露一些功能出来,通过这个,我们

比如

配置

pyproject.toml

[project.scripts]
simple_set_up = "simple_set_up.run.run_app:cli"

simple_set_up 包下有 run_app.py

def print_hi(name):
    # Use a breakpoint in the code line below to debug your script.
    print(f'Hi, {name}')  # Press Ctrl+F8 to toggle the breakpoint.

# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    print_hi('PyCharm')

# See PyCharm help at https://www.jetbrains.com/help/pycharm/

def cli():
    print('invoke from cli')
    print_hi('PyCharm')

打包之后,通过 pip install 安装,直接运行 simple_set_up 输出

$ simple_set_up
invoke from cli
Hi, PyCharm

打包之后怎么用?TODO,

在文章的的开头,我应该讲解一下如何使用 pip install

直接通过 pip install 直接安装 .tar.gz 或者 .whl


类似的其他的打包工具有 Poetry,但是不怎么流行,有两个重要的原因,一个是没必要,Setuptools 已经很好用了,另外就是会出现莫名其妙的问题,具体的讨论,在 why I will never use python-poetry - YouTube 中有所演示。




Python 的打包工具非常多,非常多,这是他们的对比

Packaging tools comparisons — Sinoroc KB

Python 的工具推荐:

Tool recommendations — Python Packaging User Guide

这里提到了 Poetry 和 setuptools 的区别,Poetry 的作用是自动管理项目依赖,setuptools 只是一个打包工具,这两个东西结合在一起,才是 Maven 的效果,还提到了 virtualenv,作用是隔离项目的依赖跟本地安装的 Python 中的依赖,

我感觉这三个东西都有学习的必要

在学习 virtualenv 之前,我要搞清楚了 Poetry 和 setuptools 的区别,TODO, https://bbc.github.io/cloudfit-public-docs/packaging/this_way_up.html

在 Pycharm 中继续看看相关的内容。TODO

现在我已经学习了如何通过 setuptools 打包,我也要学习 Poetry 来管理项目依赖,,